package br.unicamp.ic.sgct.client.apresentacao.ucs;

import java.util.List;

import br.unicamp.ic.sgct.client.aplicacao.conferencia.ConferenciaListener;
import br.unicamp.ic.sgct.client.aplicacao.usuario.UsuarioListener;
import br.unicamp.ic.sgct.client.apresentacao.views.ViewDadosTrabalho;
import br.unicamp.ic.sgct.client.apresentacao.views.ViewDadosUsuario;
import br.unicamp.ic.sgct.client.apresentacao.views.ViewListaAvaliacao;


import br.unicamp.ic.sgct.client.apresentacao.views.ViewListaConferencia;
import br.unicamp.ic.sgct.client.apresentacao.views.ViewListaTrabalho;
import br.unicamp.ic.sgct.client.apresentacao.views.ViewListaUsuario;
import br.unicamp.ic.sgct.client.dominio.to.AutorTO;
import br.unicamp.ic.sgct.client.dominio.to.AvaliacaoTO;
import br.unicamp.ic.sgct.client.dominio.to.ConferenciaTO;
import br.unicamp.ic.sgct.client.dominio.to.TrabalhoTO;
import br.unicamp.ic.sgct.client.dominio.to.UsuarioTO;

import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.Window;


import com.google.gwt.user.client.ui.DecoratedTabPanel;

public class InscricoesRealizadasScreen extends BaseConferenciaScreen {

    private ConferenciaListener controladoraConferencia = null;
    private UsuarioListener controladoraLogin = null;
    private List<UsuarioTO> participacoesConferencia = null;
    private ConferenciaTO conferencia = null;
    private UsuarioTO participacaoSelecionada = null;
    private TrabalhoTO trabalhoSelecionado = null;
    //
    private ViewListaConferencia viewListaConferencia = new ViewListaConferencia("Confer\u00eancias Abertas", 0,
            new ViewListaConferencia.HandlerClickListaConferencia() {

                @Override
                public void handle(ConferenciaTO to) {
                    showLoading(true);
                    conferencia = to;
                    controladoraLogin.getMensagemWidget().limparMensagem();
                    participacoesConferencia = null;
                    controladoraLogin.obterParticipacoesConferencia(to, new UsuarioListener.HandlerObterParticipacoesConferencia() {

                        @Override
                        public void handleSucesso(List<UsuarioTO> result) {
                            showLoading(false);
                            participacoesConferencia = result;
                            if (participacoesConferencia.isEmpty()) {
                                controladoraLogin.setMensagemErro("N\u00e3o há inscri\u00e7\u00e3o para esta confer\u00eancia");
                            } else {
                                viewListaUsuario.montar(participacoesConferencia);
                                panelTabOpcoes.selectTab(1);
                            }
                        }

                        @Override
                        public void handleErro(Throwable caught) {
                            showLoading(false);
                            controladoraLogin.setMensagemErro("InscricoesRealizadasScreen.viewListaConferencia " + caught.getMessage());
                        }
                    });
                }
            });
    private ViewListaAvaliacao viewListaAvaliacao = new ViewListaAvaliacao("Avaliações", 0, new ViewListaAvaliacao.HandlerClickListaAvaliacao() {

        @Override
        public void handle(AvaliacaoTO to) {
            Window.alert("Not supported yet.");
        }
    });
    private ViewDadosTrabalho viewDadosTrabalho = new ViewDadosTrabalho("Dados Trabalho", 3).add(viewListaAvaliacao);
    private ViewListaTrabalho viewListaTrabalho = new ViewListaTrabalho("Trabalho", 1, new ViewListaTrabalho.HandlerClickListaTrabalho() {

        @Override
        public void handle(TrabalhoTO to) {
            trabalhoSelecionado = to;
            viewDadosTrabalho.montar(trabalhoSelecionado);
            viewListaAvaliacao.montar(trabalhoSelecionado.getAvaliacoes());
            panelTabOpcoes.selectTab(3);
        }
    }).addV(viewDadosTrabalho);
    private ViewListaUsuario viewListaUsuario = new ViewListaUsuario("Participa\u00e7\u00e3o Inscri\u00e7\u00e3o", 1, new ViewListaUsuario.HandlerClickListaUsuario() {

        @Override
        public void handle(UsuarioTO to) {
            participacaoSelecionada = to;
            controladoraLogin.getMensagemWidget().limparMensagem();
            viewDadosUsuario.montar(participacaoSelecionada);
            if (participacaoSelecionada instanceof AutorTO) {
                AutorTO pto = (AutorTO) participacaoSelecionada;
                if (!pto.getTrabalhos().isEmpty()) {
                    viewListaTrabalho.montar(pto.getTrabalhos());
                }
            }
            panelTabOpcoes.selectTab(2);
        }
    });
    private ViewDadosUsuario viewDadosUsuario = new ViewDadosUsuario("Dados Usuario", 2).addV(viewListaTrabalho);

    /**
     * Inicializa os elementos UI e carrega a lista de conferencias abertas na
     * tela inicial
     * @param usuario
     * @param controladora
     * @param conferenciaCtrl
     */
    public InscricoesRealizadasScreen(final ConferenciaListener controladoraConferencia,
            final UsuarioListener controladoraLogin) {
        super();
        this.controladoraConferencia = controladoraConferencia;
        this.controladoraLogin = controladoraLogin;
        this.initWidget(super.initPanel(controladoraConferencia));

        controladoraConferencia.listarConferenciasAbertas(new ConferenciaListener.HandlerListarConferenciasAbertas() {

            @Override
            public void handleSucesso(List<ConferenciaTO> listTo) {
                if (listTo.isEmpty()) {
                    controladoraConferencia.setMensagemErro("N\u00e3o há confer\u00eancia disponível visualiza\u00e7\u00e3o de inscrições");
                } else {
                    viewListaConferencia.montar(listTo);
                }
            }

            @Override
            public void handleErro(Throwable caught) {
                controladoraConferencia.setMensagemErro(caught.getMessage());
            }
        });


    }

    @Override
    public void load() {
        this.controladoraConferencia.getMensagemWidget().limparMensagem();
        this.panelTabOpcoes.selectTab(0);

    }

    @Override
    /**
     * Monta e implementa o comportamento de visualização das abas.
     * Regras
     * aba 0 : sempre acessível, montada na entrada da opção
     * aba 1: acessível quando uma conferência foi selecionada na página da aba 0
     * aba 2: acessível quando uma inscrição foi selecionada na página da aba 1
     * aba 3: acessível quando um trabalho foi selecionada na página da aba 2
     */
    protected DecoratedTabPanel initPanelTabOpcoes() {
        panelTabOpcoes = new DecoratedTabPanel();
        panelTabOpcoes.add(viewListaConferencia, viewListaConferencia.getStrTabTitle());
        panelTabOpcoes.add(viewListaUsuario, viewListaUsuario.getStrTabTitle());
        panelTabOpcoes.add(viewDadosUsuario, viewDadosUsuario.getStrTabTitle());
        panelTabOpcoes.add(viewDadosTrabalho, viewDadosTrabalho.getStrTabTitle());
        viewListaUsuario.getStrTabTitle().setVisible(false);
        viewDadosUsuario.getStrTabTitle().setVisible(false);
        viewDadosTrabalho.getStrTabTitle().setVisible(false);
        panelTabOpcoes.selectTab(0);
        panelTabOpcoes.setWidth("750px");
        panelTabOpcoes.setAnimationEnabled(true);
        panelTabOpcoes.addSelectionHandler(new SelectionHandler() {

            @Override
            public void onSelection(SelectionEvent event) {
                Integer item = (Integer) event.getSelectedItem();
                if (item == 0) {
                    conferencia = null;
                    participacaoSelecionada = null;
                    trabalhoSelecionado = null;
                    viewListaUsuario.getStrTabTitle().setVisible(false);
                    viewDadosUsuario.getStrTabTitle().setVisible(false);
                    viewDadosTrabalho.getStrTabTitle().setVisible(false);
                } else {
                    if (item == 1) {
                        participacaoSelecionada = null;
                        trabalhoSelecionado = null;
                        if (conferencia == null) {
                            panelTabOpcoes.selectTab(0);
                            controladoraConferencia.setMensagemErro("Selenione uma Confer\u00eancia");
                        } else {
                            viewListaUsuario.getStrTabTitle().setVisible(true);
                            viewDadosUsuario.getStrTabTitle().setVisible(false);
                            viewDadosTrabalho.getStrTabTitle().setVisible(false);
                        }
                    } else {
                        if (item == 2) {
                            trabalhoSelecionado = null;
                            if (conferencia == null) {
                                panelTabOpcoes.selectTab(0);
                                controladoraConferencia.setMensagemErro("Selenione uma Confer\u00eancia");
                            } else {
                                if (participacaoSelecionada == null) {
                                    panelTabOpcoes.selectTab(1);
                                    controladoraConferencia.setMensagemErro("Selenione uma Participa\u00e7\u00e3o");
                                } else {
                                    viewListaUsuario.getStrTabTitle().setVisible(true);
                                    viewDadosUsuario.getStrTabTitle().setVisible(true);
                                    viewDadosTrabalho.getStrTabTitle().setVisible(false);
                                }
                            }
                        } else {
                            if (item == 3) {
                                if (conferencia == null) {
                                    panelTabOpcoes.selectTab(0);
                                    controladoraConferencia.setMensagemErro("Selenione uma Confer\u00eancia");
                                } else {
                                    if (participacaoSelecionada == null) {
                                        panelTabOpcoes.selectTab(1);
                                        controladoraConferencia.setMensagemErro("Selenione uma Participa\u00e7\u00e3o");
                                    } else {
                                        if (trabalhoSelecionado == null) {
                                            panelTabOpcoes.selectTab(2);
                                            controladoraConferencia.setMensagemErro("Selenione um Trabalho");
                                        } else {
                                            viewListaUsuario.getStrTabTitle().setVisible(true);
                                            viewDadosUsuario.getStrTabTitle().setVisible(true);
                                            viewDadosTrabalho.getStrTabTitle().setVisible(true);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        });
        return panelTabOpcoes;
    }
}
